package org.feng.sensitive;

import javax.annotation.PostConstruct;
import java.util.HashMap;
import java.util.Map;

/**
 * 密文接口：提供加密和解密方法
 *
 * @version v1.0
 * @author: fengjinsong
 * @date: 2023年08月25日 20时39分
 */
public abstract class AbstractSensitive {

    private static final Map<String, ? super AbstractSensitive> SENSITIVE_CACHE = new HashMap<>(16);

    /**
     * 加密
     *
     * @param text 原文
     * @return 密文
     */
    public abstract String encrypt(String text);

    /**
     * 解密
     *
     * @param ciphertext 密文
     * @return 原文
     */
    public abstract String decrypt(String ciphertext);

    /**
     * 获取加解密类型
     *
     * @return 类型
     */
    protected abstract String getSensitiveType();


    /**
     * 初始化加解密缓存
     */
    @PostConstruct
    private void typeIntoCache() {
        SENSITIVE_CACHE.put(getSensitiveType(), this);
    }

    public static <T extends AbstractSensitive> T getSensitiveByType(String sensitiveType) {
        return (T) SENSITIVE_CACHE.get(sensitiveType);
    }

    public static <T extends AbstractSensitive> T getSensitiveByTypeOrDefault(String sensitiveType, AbstractSensitive defaultSensitive) {
        return (T) SENSITIVE_CACHE.getOrDefault(sensitiveType, defaultSensitive);
    }
}
